package br.ufrn.cerescaico.sepe.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * Universidade Estadual da Paraíba
 * Cidade: Monteiro - Paraíba
 *
 * @author  Ana Emília Victor Barbosa, anaemiliabarbosa@gmail.com <br>
 * @version 1.0 <br>
 *
 * Copyright (C) 2009
 */
public class DatasPorExtenso {

	public static SimpleDateFormat RFC822DATEFORMAT = new SimpleDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US);

	
    /**
     * Insere a hora e os minutos em uma Data
     * @param dateParam - Data a ser manipulada
     * @param hourMinute - Hora a ser includa
     * @param format - separador entre hora e minuto, ex: 21:10 ou 21-20
     * @return - Retorna uma data com a hora e os minutos setados
     * @throws Exception - Caso acontea algum erro, uma excesso  lanada
     */
    public static Date setDateHourMinute(Date dateParam, String hourMinute, String format) throws Exception{
	    String[] arrHourMinute = hourMinute.split(format);
		Calendar dteComp = Calendar.getInstance();
		dteComp.setTime(dateParam);
		dteComp.set(Calendar.HOUR_OF_DAY, Integer.parseInt(arrHourMinute[0]));
		dteComp.set(Calendar.MINUTE, Integer.parseInt(arrHourMinute[1]));
        return dteComp.getTime();
    }
    
    /**
     * Insere em uma determinada data, os segundos passados
     * @param dateParam - Data a ser retornada
     * @param second - Segundos a serem inseridos
     * @return - Data com os segundos j inseridos
     */
    public static Date setDateSecond(Date dateParam, int second){
        Calendar dteComp = Calendar.getInstance();
        dteComp.setTime(dateParam);
        dteComp.set(Calendar.SECOND, second);
        return dteComp.getTime();
    }

    /**
     * Recupera uma data por extenso.
     * Ex: 17 de Maro de 2005
     * @param data - Data a ser realizado o parser
     * @return Data por extenso
     */
    public static String getDataExtenso(Date data){
    	String retorno = getDiaDoMes(data) 
						+  " de " + getMesExtenso(data)
						+ " de "+ getAno(data);    	
    	return retorno;
    }
    
    /**
     * Recupera uma data por extenso.
     * Ex: 17 de Maro de 2005
     * @param data - Data a ser realizado o parser
     * @return Data por extenso
     */
    public static String getData(Date data){
    	Calendar cal = new GregorianCalendar();
		cal.setTime(data);
		int mes = cal.get(Calendar.MONTH) + 1;
    	String retorno = getDiaDoMes(data) 
						+  "/";
    	if(mes <= 9){
    		retorno += "0" + mes;
    	}else {
    		retorno += mes;
    	}
    	retorno += "/"+ getAno(data);    	
    	return retorno;
    }
    
    
    /**
     * Metodo que obtm o dia da semana de uma determinada data
     * , ex: Segunda-Feira, Tera-Feira, etc..
     * @param data - Data a ser retirado o dia da semana
     * @return - String contendo o dia da semana
     */
    public static String getDiaSemana(Date data){
		String dt = "";
		try{
			Calendar cal = new GregorianCalendar();
			cal.setTime(data);
			int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
			if(dayOfWeek == 1) dt = "Domingo";
			if(dayOfWeek == 2) dt = "Segunda-Feira";
			if(dayOfWeek == 3) dt = "Tera-Feira";
			if(dayOfWeek == 4) dt = "Quarta-Feira";
			if(dayOfWeek == 5) dt = "Quinta-Feira";
			if(dayOfWeek == 6) dt = "Sexta-Feira";
			if(dayOfWeek == 7) dt = "Sbado";
		} catch (Exception e){
		    e.printStackTrace();
		}
		return dt;  
    }

    
    /**
     * Metodo que retorna o mes por extenso, ex: Abril
     * @param data - Data a ser retirado o mes
     * @return - Uma string contendo o mes
     */
    public static String getMesExtenso(Date data){
		String dt = "";
		try{
			Calendar cal = new GregorianCalendar();
			cal.setTime(data);
			int month = cal.get(Calendar.MONTH);
			if(month == 0) dt = "janeiro";
			if(month == 1) dt = "fevereiro";
			if(month == 2) dt = "mar�o";
			if(month == 3) dt = "abril";
			if(month == 4) dt = "maio";
			if(month == 5) dt = "junho";
			if(month == 6) dt = "julho";
			if(month == 7) dt = "agosto";
			if(month == 8) dt = "setembro";
			if(month == 9) dt = "outrubro";
			if(month == 10) dt = "novembro";
			if(month == 11) dt = "dezembro";

		} catch (Exception e){
			e.printStackTrace(); 
		}
		return dt;  
    }    

    /**
     * Metodo que retorna a data no formato: Abr/2004
     * @param data - Data a ser retirado o mes
     * @return - Uma string a data no formato: Abr/2004
     */
    public static String getDataAbreviada(Date data){
		String dt = "";
		try{
			Calendar cal = new GregorianCalendar();
			cal.setTime(data);
			int month = cal.get(Calendar.MONTH);
			if(month == 0) dt = "janeiro";
			if(month == 1) dt = "fevereiro";
			if(month == 2) dt = "mar�o";
			if(month == 3) dt = "abril";
			if(month == 4) dt = "maio";
			if(month == 5) dt = "junho";
			if(month == 6) dt = "julho";
			if(month == 7) dt = "agosto";
			if(month == 8) dt = "setembro";
			if(month == 9) dt = "outrubro";
			if(month == 10) dt = "novembro";
			if(month == 11) dt = "dezembro";
			dt += "/" + cal.get(Calendar.YEAR);
		} catch (Exception e){
			e.printStackTrace(); 
		}
		return dt;  
    } 


    /**
     * Metodo retorna o dia do mes, ex: 12
     * @param data - Data a ser retirado o dia do mes
     * @return - String contendo o dia do mes
     */
    public static String getDiaDoMes(Date data){
		String dt = "";
		try{
			Calendar cal = new GregorianCalendar();
			cal.setTime(data);
			dt = ""+ cal.get(Calendar.DAY_OF_MONTH);
		} catch (Exception e){
		    e.printStackTrace();
		}
		return dt;  
    }

    /**
     * Metodo retorna o ano, ex: 2004
     * @param data - Data a ser retirado o ano
     * @return String contendo o ano
     */
    public static String getAno(Date data){
		String dt = "";
		try{
			Calendar cal = new GregorianCalendar();
			cal.setTime(data);
			dt = ""+ cal.get(Calendar.YEAR);
		} catch (Exception e){
		    e.printStackTrace();
		}
		return dt;  
    }    

    /**
     * Retorna uma data formatada conforme String format 
     * passado
     * @param date
     * @return
     */
    public static String dateFormat(Date date, String format){
        SimpleDateFormat sf = new SimpleDateFormat(format);
        return sf.format(date);
    }

    /**
     * Calcula o total de dias de um determinado ms
     * @param month
     * @param year
     * @return Retorna o total de dias de um determinado ano e ms
     */
    public static int getTotalOfDays(int month, int year) {
		int dom[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

		if (year % 400 == 0) {
			dom[1] = 29;
		} else {
			if (year % 4 == 0 && year % 100 != 0) {
				dom[1] = 29;
			}
		}
		return dom[month - 1];
	}    
    
    
    public static String dateRFCFormat(Date date) {
        return RFC822DATEFORMAT.format(date);
    }

}
